/*
    *brief  :假设线程执行的是一个不含取消点的循环（譬如 for 循环、 while 循环），那么这时线程永远也不会响应取消请求，
            此时可以使用 pthread_testcancel()，该函数目的很简单，就是产生一个取消点，线程如果已有处于挂起状态的取消请求，那么只要调用该函数，线程就会随之终止。 
*/
//void pthread_testcancel(void);

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

static void *new_thread_start(void *arg)
{
    puts("新线程死循环执行");
	for (;;)
    {
        //不调用该函数线程无法取消，调用该函数就会产生一个取消点进行取消检测
		pthread_testcancel();
    }

	return (void *)0;
}

int main(void)
{
	pthread_t tid;
	void *tret;
	int ret;

	//申请一个线程
	ret = pthread_create(&tid, NULL, new_thread_start, NULL);
	if (ret)
	{
		fprintf(stderr, "pthread_create error:%s\n", strerror(ret));
		exit(-1);
	}

	//取消一个线程
	ret = pthread_cancel(tid);
	if (ret)
	{
		fprintf(stderr, "pthread_cancel error:%s\n", strerror(ret));
		exit(-1);
	}

	//回收一个线程
	ret = pthread_join(tid, &tret);
	if (ret)
	{
		fprintf(stderr, "pthread_join error:%s\n", strerror(ret));

		exit(-1);
	}

	printf("新线程终止, code=%ld\n", (long)tret);

	exit(0);
}